class Scaner {
    private template: string;
    private pos: number;
    private tail: string;
    // 创建构造函数
    constructor(templateStr: string) {
        // 初始化模板字符串
        this.template = templateStr;
        // 初始化指针起始位置
        this.pos = 0;
        // 初始化尾部字符串
        this.tail = templateStr;
    }

    /**
     * 获取调用方法到扫描到目标字符串之间的字符串
     * @param ideaStr 目标字符串
     * @returns 调用方法时指针位置到找到目标字符串起始位置之间的字符串/未发现目标字符串返回整个字符串模板
     */
    public scanUntil(ideaStr: string): string {
        // 记录初始调用方法位置
        const pos_start: number = this.pos;
        // 循环遍历尾部字符串
        // 当当前尾部字符扫描目标字符串的索引不为0时，说明目标串不在该指针位置
        // 为了防止无限循环，还需要判断当前位置是否大于等于模板字符串长度
        while(!this.endTemplate() && this.tail.indexOf(ideaStr) != 0) {
            // 先移动指针，再截取字符串
            // 更新指针位置
            this.pos++;
            // 更新尾部字符串
            this.tail = this.template.substring(this.pos);
        }
        // 调用方法时指针位置到找到目标字符串起始位置之间的字符串/未发现目标字符串返回整个字符串模板
        return this.template.substring(pos_start, this.pos);
    }

    /**
     * 跳跃目标字符串
     * @param ideaStr 目标字符串
     */
    public scanSkip(ideaStr: string): void {
        // console.log("scanSkip检查是否在尾端：" + !this.endTemplate);
        // console.log("scanSkip检查是否检索目标字符串：" + (this.tail.indexOf(ideaStr) == 0));
        // 当当前指针未到模板字符串末端，而且目标字符串在当前尾部字符串的索引位置为0
        if(this.endTemplate && this.tail.indexOf(ideaStr) == 0) {
            this.pos += ideaStr.length;
            // 更新tail
            this.tail = this.template.substring(this.pos);
        }
    }

    /**
     * 判断指针位置是否在模板字符串末尾端位置
     * @returns 
     */
    public endTemplate(): boolean {
        return this.pos >= this.template.length;
    }

    get getTail():string {
        return this.tail;
    }
}

export default Scaner;